package dao;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;

import pojo.AlunoTurma;



public class AlunoTurmaDaoImp implements AlunoTurmaDao {
	
	private List<AlunoTurma> alunoTurmas;
	private static int nextId;
	
	public AlunoTurmaDaoImp() {
		alunoTurmas = new ArrayList<AlunoTurma>();
		loadData();
	}
	public void loadData() {
		try{
			File in = new File("files/Registro.txt");
			InputStream fileLeitura = new  FileInputStream(in);
			InputStreamReader wLeitura = new InputStreamReader(fileLeitura);  
			BufferedReader bufLeitura = new BufferedReader(wLeitura);

			String linha = bufLeitura.readLine();
			this.alunoTurmas.clear();
			AlunoTurma aux;
			
			while(linha!= null) {
				linha = linha.trim();
				String s[] = linha.split("\\t");
				s[4] = s[4].replace(",", ".");

				List<Integer> registroAtvidades = new ArrayList<Integer>();
				for (int i = 0; i < Integer.parseInt(s[5]); i++) {
					registroAtvidades.add(Integer.parseInt(s[6+i]));
				}
				aux = new AlunoTurma(Integer.parseInt(s[0]),
						Integer.parseInt(s[1]),
						Integer.parseInt(s[2]),
						Integer.parseInt(s[3]),
						Float.parseFloat(s[4]),
						registroAtvidades);
				this.alunoTurmas.add(aux);
				linha = bufLeitura.readLine();
			}
			
			bufLeitura.close();
			wLeitura.close();
			fileLeitura.close();
		} catch (NumberFormatException e) {
			String erro = "ERRO: Dados de Registros corrompidos." +
					"\nFeche seus trabalhos e solicite ao administrador" +
					" uma restauracao deste sistema.";
			System.out.println(erro);
			// throw new IOException(erro);
		} catch (IOException e) {
			String erro = "Aviso: Nao foi possivel encontrar os dados dos " +
					"Registros. Se esta for a primeira execucao do sistema " +
					"por favor desconsidere o problema, caso contrario " +
					"feche o programa e contate o administrador.";
			System.out.println(erro);
			// throw new IOException(erro);
		}
		updateNextId();
	}
	@Override
	public void saveData() {
		try{
			File out = new File("files/Registro.txt");
			OutputStream fileEscrita = new  FileOutputStream(out);
			OutputStreamWriter wEscrita = new OutputStreamWriter(fileEscrita);  
			BufferedWriter bufEscrita = new BufferedWriter(wEscrita);

			for (AlunoTurma registro : this.alunoTurmas) {
				bufEscrita.write(registro.toStringIDs()+"\n");
			}

			bufEscrita.close();
			wEscrita.close();
			fileEscrita.close();
		}
		catch(IOException e){
			System.out.println("ERRO: Nao foi possivel salvar os dados dos " +
					"Registros no sistema."
					+ "\nContate o administrador e informe este erro.");
		}
		updateNextId();
	}
	@Override
	public boolean add(AlunoTurma registro) {
		if ((this.alunoTurmas.contains(registro)) || (hasAlunoCadastrado(registro))) {
			return false;
		} else {
			this.alunoTurmas.add(registro);
			updateNextId();
			saveData();
			return true;
		}
	}
	private boolean hasAlunoCadastrado(AlunoTurma registroIn) {
		for (AlunoTurma registro : alunoTurmas) {
			if ((registro.getAlunoId() == registroIn.getAlunoId())
					&& (registro.getTurmaId() == registroIn.getTurmaId())){
				return true;
			}
		}
		return false;
	}
	@Override
	public boolean delete(AlunoTurma registro) {
		// TODO Auto-generated method stub
		return false;
	}
	@Override
	public AlunoTurma get(int id) {
		for (AlunoTurma registro : alunoTurmas) {
			if(registro.getId() == id){
				return registro;
			}
		}
		return null;
	}
	@Override
	public List<AlunoTurma> getByTurma(int turmaId) {
		ArrayList<AlunoTurma> lista = new ArrayList<AlunoTurma>();
		for (AlunoTurma reg : alunoTurmas) {
			if (reg.getTurmaId() == turmaId) {
				lista.add(reg);
			}
		}
		return lista;
	}
	@Override
	public List<AlunoTurma> getByAluno(int alunoId) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public AlunoTurma getByAmbos(int turmaId, int alunoId) {
		for (AlunoTurma alunoTurma : this.alunoTurmas) {
			if (alunoTurma.getTurmaId() == turmaId &&
				alunoTurma.getAlunoId() == alunoId) {
				return alunoTurma;
			}
		}
		return null;
	}
	private void updateNextId(){
		int id = 0;
		while(hasId(id)){
			id++;
		}
		nextId = id;
		return;
	}
	public boolean hasId(int id){
		for (AlunoTurma registro : this.alunoTurmas) {
			if(registro.getId() == id) {
				return true;
			}
		}
		return false;
	}
	public static int getNextId() {
		return nextId;
	}
	public static void main(String[] arg0) {
		AlunoTurmaDao registroDao = new AlunoTurmaDaoImp();
		List<Integer> registroAtividades = new ArrayList<Integer>();
		for (int i = 0; i < 13; i++) {
			registroAtividades.add((i+5) % 13);
		}
		AlunoTurma registro = new AlunoTurma(0, 1, 2, 18, (float)6.1, registroAtividades);
		registroDao.add(registro);
		registroDao.saveData();
	}
	@Override
	public List<AlunoTurma> get(){
		return alunoTurmas;
	}
	public void listar(AlunoDaoImp alunoDao){
		System.out.println("--------------------");
		for (AlunoTurma registro : this.alunoTurmas) {
			System.out.println("-> "+registro.toString(alunoDao));
		}
		System.out.println("--------------------");
	}
	@Override
	public void clearAll() {
		alunoTurmas.clear();
	}
	
}
